home *** CD-ROM | disk | FTP | other *** search
/ Delphi Magazine Collection 2001 / Delphi Magazine Collection 20001 (2001).iso / DISKS / ISSUE09 / CODERS / STRFUNC.PAS < prev   
Pascal/Delphi Source File  |  1995-11-20  |  11KB  |  401 lines

  1. unit StrFunc ;
  2. (*****) interface (*******************************)
  3.  
  4. uses
  5.   ChrConst ;
  6.  
  7. const
  8.   MaxPasString = SizeOf( string ) - 1 ;
  9.   NULLSTR = '' ;
  10.  
  11. function PadLeft( Strng, Padding : string ; Count : byte ) : string ;
  12. (* pad left end of input string with Padding Count times *)
  13.  
  14. function PadRight( Strng, Padding : string ; Count : byte ) : string ;
  15. (* pad right end of input string with Padding Count times *)
  16.  
  17. function PadBoth( Strng, Padding : string ; Count : byte ) : string ;
  18. (* pad both ends of input string with Padding Count times *)
  19.  
  20. function InStr( SubStr, Strng : string ; StartIndex : byte ) : byte ;
  21. (* simulates BASIC's InStr function with an offset *)
  22.  
  23. function InStrCt( SubStr, Strng : string ; StartIndex : byte ) : byte ;
  24. (* returns the number of instances of SubStr in Strng beginning *)
  25. (* at offset StartIndex                                         *)
  26.  
  27. function Left( Strng : string ; NumChars : byte ) : string ;
  28. (* simulates BASIC's Left$ function *)
  29.  
  30. function Right( Strng : string ; NumChars : byte ) : string ;
  31. (* simulates BASIC's Right$ function *)
  32.  
  33. function Mid( Strng : string ; Start, Count : byte ) : string ;
  34. (* simulates BASIC's Mid$ function *)
  35.  
  36. function PosMid( Strng : string ; First, Last : byte ) : string ;
  37. (* simulates True BASIC's string extraction by indices *)
  38.  
  39. function DnCase( C  : char )  : char ;
  40. (*  returns Lowercase of C; meant to parallel built in UpCase function; *)
  41. (*  naive about diacritical high byte characters, only translates A..Z  *)
  42.  
  43. function StrRep( var S : string ; ch1, ch2 : char ) : word ;
  44. (* replaces all occurrences of ch1 in S with ch2 *)
  45. (* returns number of replacements made, 0 if no  *)
  46. (* replacements are made                         *)
  47.  
  48. function Replace( var S : string ; Orig, Rep : string ; Count : byte ) : word ;
  49. (* replaces all occurences of Orig string in S with Rep string   *)
  50. (* returns the number of replacements made, 0 if no replacements *)
  51. (* were made                                                     *)
  52.  
  53. function Chop( S : string ; Len : byte ) : string ;
  54. (* trim a string to a specified length *)
  55.  
  56. function LeftChop( S : string ; Len : byte ) : string ;
  57. (* return rightmost characters of a string *)
  58.  
  59. function Trim( S : string ; c : char ) : string ;
  60. (* trim any examples of character 'c' from beginning and ending of string *)
  61.  
  62. function LTrim( S : string ; c : char ) : string ;
  63. (* trim any examples of character 'c' from beginning of string *)
  64.  
  65. function RTrim( S : string ; c : char ) : string ;
  66. (* trim any examples of character 'c' from end of string *)
  67.  
  68. function LoCase( Ch : char ) : char ;
  69. function LowerCase( const S : string ) : string ;
  70. function UpperCase( const S : string ) : string ;
  71.  
  72.  
  73.  
  74. (*****) implementation (**************************)
  75.  
  76. function PadLeft( Strng, Padding : string ; Count : byte ) : string ;
  77. (* pad left end of input string with Padding Count times *)
  78. var
  79.   S : string ;
  80.   i : byte ;
  81. begin
  82.   S := Strng ;
  83.   for i := 1 to Count do
  84.     S := Padding + S ;
  85.   PadLeft := S ;
  86. end ;
  87.  
  88. function PadRight( Strng, Padding : string ; Count : byte ) : string ;
  89. (* pad right end of input string with Padding Count times *)
  90. var
  91.   S : string ;
  92.   i : byte ;
  93. begin
  94.   S := Strng ;
  95.   for i := 1 to Count do
  96.     S := S + Padding ;
  97.   PadRight := S ;
  98. end ;
  99.  
  100. function PadBoth( Strng, Padding : string ; Count : byte ) : string ;
  101. (* pad both ends of input string with Padding Count times *)
  102. var
  103.   S : string ;
  104. begin (* function -- PadStr *)
  105.   S := Strng ;
  106.   S := PadLeft( S, Padding, Count ) ;
  107.   S := PadRight( S, Padding, Count ) ;
  108.   PadBoth := S ;
  109. end   (* function -- PadStr *) ;
  110.  
  111.  
  112. function InStr( SubStr, Strng : string ; StartIndex : byte ) : byte ;
  113. (* simulates BASIC's InStr function with an offset *)
  114. var
  115.   StrPos : byte ;
  116. begin
  117. (*  argument checking *)
  118.  
  119.   if ( Strng = NULLSTR ) or ( SubStr = NULLSTR ) then
  120.   begin
  121.     InStr := 0 ;
  122.     Exit ;
  123.   end (* if *) ;
  124.  
  125.   StrPos := 0 ;
  126.  
  127. (*  Main body of procedure *)
  128.   if ( StartIndex > 0 ) and ( StartIndex <= Length( Strng )) then
  129.   begin
  130.   (* clip leading part of the string Strng? *)
  131.     if StartIndex > 1 then
  132.       Delete( Strng, 1, StartIndex - 1 ) ;
  133.     StrPos := Pos( SubStr, Strng ) ;
  134.     if ( StrPos > 0 ) and ( StartIndex > 1 ) then
  135.       Inc( StrPos, StartIndex - 1 ) ;
  136.   end (* if *) ;
  137.  
  138.   InStr := StrPos ;
  139. end (* function InStr *) ;
  140.  
  141. function Left( Strng : string ; NumChars : byte ) : string ;
  142. (* simulates BASIC's Left$ function *)
  143. begin
  144.   Left := Copy( Strng, 1, NumChars ) ;
  145. end (* function Left *) ;
  146.  
  147. function Right( Strng : string ; NumChars : byte ) : string ;
  148. (* simulates BASIC's Right$ function *)
  149. var
  150.   StartPos : byte ;
  151. begin
  152.   if NumChars > Length( Strng ) then
  153.     StartPos := 1
  154.   else
  155.     StartPos := Length( Strng ) - NumChars + 1 ;
  156.   Right := Copy( Strng, StartPos, Length( Strng )) ;
  157. end ;
  158.  
  159. function Mid( Strng : string ; Start, Count : byte ) : string ;
  160. (* simulates BASIC's Mid$ function *)
  161. begin
  162.   Mid := Copy( Strng, Start, Count ) ;
  163. end ;
  164.  
  165. function PosMid( Strng : string ; First, Last : byte ) : string ;
  166. (* simulates True BASIC's string extraction by indices *)
  167. var
  168.   EndPos : byte ;
  169. begin
  170.   (* argument checking *)
  171.   if ( Strng = NULLSTR ) or ( Last < First ) then
  172.   begin
  173.     PosMid := NULLSTR ;
  174.     Exit ;
  175.   end (* if *) ;
  176.  
  177.   EndPos := Last - First + 1 ;
  178.   PosMid := Copy( Strng, First, EndPos ) ;
  179. end ;
  180.  
  181. function DnCase( C : char ) : char ;
  182. (* returns Lowercase of C; meant to parallel built in UpCase function; *)
  183. (* naive about diacritical high byte characters, only translates A..Z  *)
  184. const
  185.   lcArray : array ['A'..'Z'] of char = 'abdcefghijklmnopqrstuvwxyz' ;
  186. begin
  187. (*  LCase := Chr( Ord( C ) - Ord( 'A' ) + Ord( 'a' )) ; *)
  188.   if not ( C in ['A'..'Z']) then
  189.     DnCase := C
  190.   else
  191.     DnCase := lcArray[C] ;
  192. end ;
  193.  
  194. function StrRep( var S : string ; ch1, ch2 : char ) : word ;
  195. (* replaces all occurrences of ch1 in S with ch2 *)
  196. (* returns number of replacements made, 0 if no  *)
  197. (* replacements are made                         *)
  198. var
  199.   Ct, i : word ;
  200. begin
  201.   Ct := 0 ;
  202.   for i := 1 to Length( S ) do
  203.     if S[i] = ch1 then
  204.     begin
  205.       S[i] := ch2 ;
  206.       Inc( Ct ) ;
  207.     end ;
  208.   StrRep := Ct ;
  209. end ;
  210.  
  211. function InStrCt( SubStr, Strng : string ; StartIndex : byte ) : byte ;
  212. (* returns the number of instances of SubStr in Strng beginning *)
  213. (* at offset StartIndex                                         *)
  214. var
  215.   Index, Len, SubLen, Ct, Loc : byte ;
  216. begin
  217.   if Strng = '' then
  218.   begin
  219.     InStrCt := 0 ;
  220.     Exit ;
  221.   end ;
  222.  
  223.   Loc := InStr( SubStr, Strng, StartIndex ) ;
  224.   if Loc = 0 then
  225.   begin
  226.     InStrCt := 0 ;
  227.     Exit ;
  228.   end ;
  229.  
  230.   Len := Length( Strng ) ;
  231.   SubLen := Length( SubStr ) ;
  232.   Index := Loc ;
  233.   Ct := 1 ;
  234.  
  235.   while ( Index <= Len ) and ( Loc <> 0 ) do
  236.   begin
  237.     Loc := InStr( SubStr, Strng, Index + SubLen ) ;
  238.     if Loc <> 0 then
  239.     begin
  240.       Inc( Ct ) ;
  241.       Index := Loc ;
  242.     end ;
  243.   end ;
  244.   InStrCt := Ct ;
  245. end ;
  246.  
  247.  
  248. function Replace( var S : string ; Orig, Rep : string ; Count : byte ) : word ;
  249. (* replaces Count occurences of Orig string in S with Rep string *)
  250. (* returns the number of replacements made, 0 if no replacements *)
  251. (* were made                                                     *)
  252. var
  253.   OLen, RLen, Ct, Loc : byte ;
  254.   Fore, Aft : string ;
  255. begin
  256.   if S = '' then
  257.   begin
  258.     Replace := 0 ;
  259.     Exit ;
  260.   end ;
  261.  
  262.   Loc := InStr( Orig, S, 1 ) ;
  263.   if Loc = 0 then
  264.   begin
  265.     Replace := 0 ;
  266.     Exit ;
  267.   end ;
  268.  
  269.   OLen := Length( Orig ) ;
  270.   RLen := Length( Rep ) ;
  271.   Ct := 0 ;
  272.   Aft := S ;
  273.   Fore := '' ;
  274.   repeat
  275.     Fore := Fore + Left( Aft, Loc - 1 ) + Rep ;
  276.     Aft := Mid( Aft, Loc + OLen, Length( Aft )) ;
  277.     Inc( Ct ) ;
  278.     Loc := InStr( Orig, Aft, 1 ) ;
  279.   until ( Loc = 0 ) or ( Ct = Count ) ;
  280.   S := Fore + Aft ;
  281.   Replace := Ct ;
  282. end ;
  283.  
  284. function Chop( S : string ; Len : byte ) : string ;
  285. (* trim a string to a specified length *)
  286. var
  287.   Temp : string ;
  288. begin
  289.   Temp := S ;
  290.   if Length( Temp ) > Len then
  291.     Temp[0] := Chr( Len ) ;
  292.   Chop := Temp ;
  293. end ;
  294.  
  295. function LeftChop( S : string ; Len : byte ) : string ;
  296. (* return rightmost characters of a string *)
  297. var
  298.   Temp : string ;
  299. begin
  300.   Temp := S ;
  301.   if Length( Temp ) > Len then
  302.   begin
  303.     Move( Temp[Succ( Length( Temp ) - Len )],
  304.       S[1], Len ) ;
  305.     Temp[0] := Chr( Len ) ;
  306.   end ;
  307.   LeftChop := Temp ;
  308. end ;
  309.  
  310. function Trim( S : string ; c : char ) : string ;
  311. (* trim any examples of character 'c' from beginning and ending of string *)
  312. var
  313.   Temp : string ;
  314. begin
  315.   Temp := S ;
  316.   Temp := LTrim( Temp, c ) ;
  317.   Temp := RTrim( Temp, c ) ;
  318.   Trim := Temp ;
  319. end ;
  320.  
  321. function LTrim( S : string ; c : char ) : string ;
  322. (* trim any examples of character 'c' from beginning of string *)
  323. var
  324.   Temp : string ;
  325.   P : byte ;
  326. begin
  327.   P := 1 ;
  328.   Temp := S ;
  329.   while ( Temp[P] = C ) and ( P <= Length( Temp )) do
  330.     Inc( P ) ;
  331.   case P of
  332.     0 : Temp[0] := #0 ; (* string was 255 of C! *)
  333.     1 : (* not found, do nothing *) ;
  334.     else
  335.       Move( Temp[P], Temp[1], Succ( Length( S ) - P )) ;
  336.       Dec( Temp[0], Pred( P )) ;
  337.   end (* case *) ;
  338.   LTrim := Temp ;
  339. end ;
  340.  
  341.  
  342. function RTrim( S : string ; c : char ) : string ;
  343. (* trim any examples of character 'c' from end of string *)
  344. var
  345.   Temp : string ;
  346. begin
  347.   Temp := S ;
  348.   while Temp[Length( Temp )] = C do
  349.     Dec( Temp[0] ) ;
  350.   RTrim := Temp ;
  351. end ;
  352.  
  353. function LoCase( Ch : char ) : char ;
  354. const
  355.   LoArray : array ['A'..'Z'] of char =
  356.     'abcdefghijklmnopqrstuvwxyz' ;
  357. begin
  358.   if Ch in ['A'..'Z'] then
  359.     Ch := LoArray[Ch] ;
  360. end ;
  361.  
  362. function LowerCase( const S : string ) : string ;
  363. var
  364.   i : byte ;
  365.   Temp : string ;
  366. begin
  367.   for i := 1 to Length( S ) do
  368.     if S[i] in ['A'..'Z'] then
  369.       Temp[i] := LoCase( S[i] )
  370.     else
  371.       Temp[i] := S[i];
  372.   Temp[0] := Chr( Length( S )) ;
  373.   LowerCase := Temp ;
  374. end ;
  375.  
  376. function UpperCase( const S : string ) : string ;
  377. var
  378.   i : byte ;
  379.   Temp : string ;
  380. begin
  381.   for i := 1 to Length( S ) do
  382.     if S[i] in ['a'..'z'] then
  383.       Temp[i] := UpCase( S[i] )
  384.     else
  385.       Temp[i] := S[i];
  386.   Temp[0] := Chr( Length( S )) ;
  387.   UpperCase := Temp ;
  388.  
  389. end ;
  390.  
  391.  
  392. {$ifdef ver80 }
  393. initialization
  394. {$else}
  395. begin
  396. {$endif}
  397.     (* unit strfunc -- initialization code *)
  398.   (* NONE *)
  399. end (* unit strfunc -- initialization code *) .
  400.  
  401.